﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace AvaProvi
{
    [Serializable]
    public class clsAvaluo_CRN:clsEstado, IControlEstados, ICloneable
    {
        private string strFolioIntermediario;

        #region Propiedades de Clase
        public int IdAvaluo { get; set; }
        public string Folio { get; set; }
        public string ClaveAvaluo { get; set; }
        public double ValorReferencial { get; set; }
        public clsUsuario_CRN Capturista { get; set; }
        public string Revisor { get; set; }
        public string Intermediario { get; set; }
        public string LineaInfonavit { get; set; }
        public string CondicionInfonavit { get; set; }
        public string FolioValuador { get; set; }
        public string FolioIntermediario
        {
            get { return strFolioIntermediario; }
            set
            {
                if (value != "030001")
                {
                    this.LineaInfonavit = string.Empty;
                    this.CondicionInfonavit = string.Empty;
                    if (this.Inmueble != null)
                    {
                        this.Inmueble.NoDeCedulaInfonavit = string.Empty;
                        this.Inmueble.NoDeVivienda = 0;
                        this.Inmueble.NoPaqueteInfonavit = string.Empty;
                    }
                }
                strFolioIntermediario = value;
            }
        }
        public DateTime FechaAvaluo { get; set; }
        public DateTime FechaInspeccion { get; set; }
        public string ClaveValuador { get; set; }
        public string ClaveControladorSHF { get; set; }
        public string Proposito { get; set; }
        public string Objetivo { get; set; }
        public string Regimen { get; set; }
        public string ConsideracionesPrevias { get; set; }
        public string ObservacionesSantander { get; set; }
        public clsInmueble_CRN Inmueble { get; set; }
        public clsPersona_CRN Solicitante { get; set; }
        public clsDireccion_CRN DireccionDeSolicitante { get; set; }
        public BindingList<clsDeclaracionAdvertencia_CRN> Declaraciones { get; set; }
        public BindingList<clsDeclaracionAdvertencia_CRN> Advertencias { get; set; }
        public clsDeclaracionAdvertencia_CRN OtraDeclaracion { get; set; }
        public clsDeclaracionAdvertencia_CRN OtraAdvertencia { get; set; }
        public static clsAvaluo_CRN AvaluoActual { get; set; }
        public static clsAvaluo_CRN AvaluoCopiado { get; set; }
        #endregion

        public clsAvaluo_CRN():base()
        {
            this.Capturista = clsUsuario_CRN.UsuarioActivo;
            this.ClaveAvaluo = string.Empty;
            this.ClaveControladorSHF = string.Empty;
            this.ClaveValuador = string.Empty;
            this.CondicionInfonavit = string.Empty;
            this.ConsideracionesPrevias = "Después de analizar los enfoques anteriores concluimos que el valor comercial será el valor: ";
            this.Folio = string.Empty;
            this.FolioIntermediario = string.Empty;
            this.FolioValuador = string.Empty;
            this.Intermediario = string.Empty;
            this.LineaInfonavit = string.Empty;
            this.Objetivo = string.Empty;
            this.ObservacionesSantander = string.Empty;
            this.Proposito = string.Empty;
            this.Regimen = string.Empty;
            this.Revisor = string.Empty;
            this.ValorReferencial = 0;
            this.FechaAvaluo = DateTime.Now;
            this.FechaInspeccion = DateTime.Now;
            this.Inmueble = new clsInmueble_CRN(this);
            this.Solicitante = new clsPersona_CRN("SOL", this);
            this.DireccionDeSolicitante = new clsDireccion_CRN("SOL", this);
            this.RecuperaDeclaraciones();
        }


        public static BindingList<clsAvaluo_CRN> recuperaAvaluos()
        {
            clsAvaluo_CD objAvaluo_CD = new clsAvaluo_CD();
            BindingList<clsAvaluo_CRN> blAvaluos = new BindingList<clsAvaluo_CRN>();
            BindingList<dsAvaluos.AvaluosRow> blAvaluosRecuperados = objAvaluo_CD.RecuperaAvaluos();
            foreach (dsAvaluos.AvaluosRow filaAvaluo in blAvaluosRecuperados)
            {
                clsAvaluo_CRN objAvaluo = new clsAvaluo_CRN();
                objAvaluo.Capturista = clsUsuario_CRN.RecuperaUsuario(filaAvaluo.Capturista);
                objAvaluo.ClaveAvaluo = filaAvaluo.ClaveAvaluo;
                objAvaluo.ClaveControladorSHF = filaAvaluo.ClaveControlador;
                objAvaluo.ClaveValuador = filaAvaluo.ClaveValuador;
                objAvaluo.CondicionInfonavit = filaAvaluo.CondicionInfonavit;
                objAvaluo.EsModificado = true;
                objAvaluo.FechaAvaluo = filaAvaluo.FechaAvaluo;
                objAvaluo.FechaInspeccion = filaAvaluo.FechaInspeccion;
                objAvaluo.Folio = filaAvaluo.Folio;
                objAvaluo.FolioIntermediario = filaAvaluo.FolioIntermediario;
                objAvaluo.FolioValuador = filaAvaluo.FolioValuador;
                objAvaluo.IdAvaluo = filaAvaluo.IDAvaluo;
                objAvaluo.Intermediario = filaAvaluo.Intermediario;
                objAvaluo.LineaInfonavit = filaAvaluo.LineaInfonavit;
                objAvaluo.Objetivo = filaAvaluo.Objetivo;
                objAvaluo.Proposito = filaAvaluo.Proposito;
                objAvaluo.Regimen = filaAvaluo.Regimen;
                objAvaluo.Revisor = filaAvaluo.Revisor;
                objAvaluo.ValorReferencial = filaAvaluo.ValorReferencial;
                objAvaluo.ObservacionesSantander = filaAvaluo.ObservacionesSantander;
                objAvaluo.ConsideracionesPrevias = filaAvaluo.ConsideracionesPrevias;
                objAvaluo.Solicitante = clsPersona_CRN.RecuperaPersona(objAvaluo, "SOL");
                objAvaluo.DireccionDeSolicitante = clsDireccion_CRN.RecuperaDireccion(objAvaluo, "SOL");
                objAvaluo.Inmueble = clsInmueble_CRN.RecuperaInmuebleDeAvaluo(objAvaluo);
                objAvaluo.RecuperaDeclaraciones();
                blAvaluos.Add(objAvaluo);
            }

            return blAvaluos;
        }

        public static BindingList<clsAvaluo_CRN> recuperaAvaluosDeCapturista(clsUsuario_CRN objCapturista)
        {
            clsAvaluo_CD objAvaluo_CD = new clsAvaluo_CD();
            BindingList<clsAvaluo_CRN> blAvaluos = new BindingList<clsAvaluo_CRN>();
            BindingList<dsAvaluos.AvaluosRow> blAvaluosRecuperados = objAvaluo_CD.RecuperaAvaluosDeCapturista(objCapturista.LoginName);
            foreach (dsAvaluos.AvaluosRow filaAvaluo in blAvaluosRecuperados)
            {
                clsAvaluo_CRN objAvaluo = new clsAvaluo_CRN();
                objAvaluo.Capturista = clsUsuario_CRN.RecuperaUsuario(filaAvaluo.Capturista);
                objAvaluo.ClaveAvaluo = filaAvaluo.ClaveAvaluo;
                objAvaluo.ClaveControladorSHF = filaAvaluo.ClaveControlador;
                objAvaluo.ClaveValuador = filaAvaluo.ClaveValuador;
                objAvaluo.CondicionInfonavit = filaAvaluo.CondicionInfonavit;
                objAvaluo.EsModificado = true;
                objAvaluo.FechaAvaluo = filaAvaluo.FechaAvaluo;
                objAvaluo.FechaInspeccion = filaAvaluo.FechaInspeccion;
                objAvaluo.Folio = filaAvaluo.Folio;
                objAvaluo.FolioIntermediario = filaAvaluo.FolioIntermediario;
                objAvaluo.FolioValuador = filaAvaluo.FolioValuador;
                objAvaluo.IdAvaluo = filaAvaluo.IDAvaluo;
                objAvaluo.Intermediario = filaAvaluo.Intermediario;
                objAvaluo.LineaInfonavit = filaAvaluo.LineaInfonavit;
                objAvaluo.Objetivo = filaAvaluo.Objetivo;
                objAvaluo.Proposito = filaAvaluo.Proposito;
                objAvaluo.Regimen = filaAvaluo.Regimen;
                objAvaluo.Revisor = filaAvaluo.Revisor;
                objAvaluo.ValorReferencial = filaAvaluo.ValorReferencial;
                objAvaluo.ObservacionesSantander = filaAvaluo.ObservacionesSantander;
                objAvaluo.ConsideracionesPrevias = filaAvaluo.ConsideracionesPrevias;
                objAvaluo.Solicitante = clsPersona_CRN.RecuperaPersona(objAvaluo, "SOL");
                objAvaluo.DireccionDeSolicitante = clsDireccion_CRN.RecuperaDireccion(objAvaluo, "SOL");
                objAvaluo.Inmueble = clsInmueble_CRN.RecuperaInmuebleDeAvaluo(objAvaluo);
                objAvaluo.RecuperaDeclaraciones();
                blAvaluos.Add(objAvaluo);
            }

            return blAvaluos;
        }

        public bool Guardar()
        {
            if (DatosValidos())
            {
                if (this.EsNuevo)
                    return CreaAvaluo();
                else
                {
                    if (this.EsModificado)
                        return AcualizaAvaluo();
                    else
                        return EliminaAvaluo();
                }
            }
            return false;
        }

        private bool EliminaAvaluo()
        {
            clsAvaluo_CD objAvaluo_CD = new clsAvaluo_CD();
            return objAvaluo_CD.EliminaAvaluo(this);
        }

        private bool AcualizaAvaluo()
        {
            clsAvaluo_CD objAvaluo_CD = new clsAvaluo_CD();
            if (objAvaluo_CD.AcualizaAvaluo(this))
            {
                this.Solicitante.Guardar();
                this.DireccionDeSolicitante.Guardar();
                this.Inmueble.Guardar();
                foreach (clsDeclaracionAdvertencia_CRN objDeclaracion in this.Declaraciones)
                {
                    objDeclaracion.Guardar();
                }
                foreach (clsDeclaracionAdvertencia_CRN objAdvertencia in this.Advertencias)
                {
                    objAdvertencia.Guardar();
                }
                this.OtraAdvertencia.Guardar();
                this.OtraDeclaracion.Guardar();
                return true;
            }
            return false;
        }

        private bool CreaAvaluo()
        {
            clsAvaluo_CD objAvaluo_CD = new clsAvaluo_CD();
            if (objAvaluo_CD.CreaAvaluo(this))
            {
                this.EsModificado = true;

                this.Solicitante.Guardar();
                this.DireccionDeSolicitante.Guardar();
                this.Inmueble.Guardar();

                foreach (clsDeclaracionAdvertencia_CRN objDeclaracion in this.Declaraciones)
                {
                    objDeclaracion.Guardar();
                }

                foreach (clsDeclaracionAdvertencia_CRN objAdvertencia in this.Advertencias)
                {
                    objAdvertencia.Guardar();
                }

                OtraDeclaracion.Guardar();

                OtraAdvertencia.Guardar();
                RecuperaDeclaraciones();
                return true;
            }
            return false;
        }

        public bool DatosValidos()
        {
            return true;
        }

        private void RecuperaDeclaraciones()
        {
            this.Declaraciones = clsDeclaracionAdvertencia_CRN.RecuperaDeclaracionesAdvertencias(this, "DEC");
            this.Advertencias = clsDeclaracionAdvertencia_CRN.RecuperaDeclaracionesAdvertencias(this, "ADV");
            this.OtraDeclaracion = clsDeclaracionAdvertencia_CRN.RecuperaDeclaracionAdvertencia(this, "OTD");
            this.OtraAdvertencia = clsDeclaracionAdvertencia_CRN.RecuperaDeclaracionAdvertencia(this, "OTA");
        }


        #region ICloneable Members

        //Crea una copia del objeto this
        public object Clone()
        {
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, this);
            ms.Position = 0;
            object obj = bf.Deserialize(ms);
            ms.Close();
            return obj;
        }

        //Convierte el estado EsNuevo a true al parámetro pasado
        public static void ConvertirAnuevo(clsAvaluo_CRN AvaluoApegar)
        {
            AvaluoApegar.ClaveAvaluo = "No asignado";
            AvaluoApegar.EsNuevo = true;
            foreach (clsDeclaracionAdvertencia_CRN objAdvertencias in AvaluoApegar.Advertencias)
            {
                objAdvertencias.EsNuevo = true;
            }
            foreach (clsDeclaracionAdvertencia_CRN objDeclaracion in AvaluoApegar.Declaraciones)
            {
                objDeclaracion.EsNuevo = true;
            }
            AvaluoApegar.DireccionDeSolicitante.EsNuevo = true;
            AvaluoApegar.Folio = string.Empty;
            AvaluoApegar.Inmueble.ConvertirANuevo();
            AvaluoApegar.OtraAdvertencia.EsNuevo = true;
            AvaluoApegar.OtraDeclaracion.EsNuevo = true;
            AvaluoApegar.Solicitante.EsNuevo = true;
        }

        #endregion
    }
}
